<?php
// +----------------------------------------------------------------------
// | Create By PHPSTORM.
// +----------------------------------------------------------------------
// | Function：地图转换工具类
// +----------------------------------------------------------------------
// | Date：2019-09-18 13:38
// +----------------------------------------------------------------------
// | Author: yvhsse <tangbin@zwee.vip>
// +----------------------------------------------------------------------


namespace yvhsse;

class MapTools
{

    /**
     * Function: 计算某个经纬度的周围某段距离的正方形的四个点
     * @param float     $lng      经度
     * @param float     $lat      纬度
     * @param int|float $distance 该点所在圆的半径，该圆与此正方形内切，默认值为1千米
     * @return array 正方形的四个点的经纬度坐标
     * @Author: yvhsse
     * @Date  : 2019-09-18 13:38
     */
    public function SquarePoint(float $lng, float $lat, int $distance = 1): array
    {
        $earthdata = 6371;//地球半径，平均半径为6371km
        $dlng = 2 * asin(sin($distance / (2 * $earthdata)) / cos(deg2rad($lat)));
        $dlng = rad2deg($dlng);
        $dlat = $distance / $earthdata;
        $dlat = rad2deg($dlat);
        $arr = array(
            'left_top'     => array('lng' => $lng - $dlng, 'lat' => $lat + $dlat),
            'right_top'    => array('lng' => $lng + $dlng, 'lat' => $lat + $dlat),
            'left_bottom'  => array('lng' => $lng - $dlng, 'lat' => $lat - $dlat),
            'right_bottom' => array('lng' => $lng + $dlng, 'lat' => $lat - $dlat)
        );
        return $arr;
    }

    /**
     * 求两个已知经纬度之间的距离,单位为米
     * @param float $lng1 经度1
     * @param float $lat1 纬度1
     * @param float $lng2 经度2
     * @param float $lat2 纬度2
     * @return float 距离，单位米
     * @Author: yvhsse
     * @Date  : 2019-09-18 13:36
     */
    public function getDistance(float $lng1, float $lat1, float $lng2, float $lat2): float
    {
        // 将角度转为狐度
        $radLat1 = deg2rad($lat1); //deg2rad()函数将角度转换为弧度
        $radLat2 = deg2rad($lat2);
        $radLng1 = deg2rad($lng1);
        $radLng2 = deg2rad($lng2);
        $a = $radLat1 - $radLat2;
        $b = $radLng1 - $radLng2;
        $s = 2 * asin(sqrt(pow(sin($a / 2), 2) + cos($radLat1) * cos($radLat2) * pow(sin($b / 2), 2))) * 6371 * 1000;
        return round($s);
    }
}